package pharao.client.views.game.landkarte.ort.basics;

import java.util.Iterator;
import java.util.List;

import hmvc4gwt.client.event.IHmvcEvent;
import pharao.client.dto.AufgabenStatusDTO;
import pharao.client.dto.OrtDTO;
import pharao.client.dto.OrtStatusDTO;
import pharao.client.views.events.GetModelDataEvent;
import pharao.client.views.events.SetModelDataEvent;
import pharao.client.views.game.landkarte.ort.AOrtModel;
import pharao.client.views.game.landkarte.ort.basics.events.GetOrtStatusEvent;
import pharao.client.views.game.landkarte.ort.basics.events.SetOrtStatusEvent;
import pharao.client.views.game.landkarte.ort.exam.Examen;
import pharao.client.views.game.landkarte.ort.exam.events.GetExamenEvent;
import pharao.client.views.game.landkarte.ort.exam.events.SetExamenEvent;
import pharao.client.views.game.landkarte.ort.lesson.Lesson;
import pharao.client.views.game.landkarte.ort.training.events.AddTrainingResultEvent;
import pharao.client.views.game.landkarte.ort.training.events.GetTrainingLessonsEvent;
import pharao.client.views.game.landkarte.ort.training.events.SetTrainingLessonsEvent;

public class OrtBasicsModel extends AOrtModel {
	
	public OrtBasicsModel(OrtDTO ortDTO) {
		setOrtDTO(ortDTO);
	}

	public void init() {
		getController().register(GetModelDataEvent.class, this);
		getController().register(AddTrainingResultEvent.class, this);
		getController().register(GetTrainingLessonsEvent.class, this);
		getController().register(GetExamenEvent.class, this);
		getController().register(GetOrtStatusEvent.class, this);
	}

	public void handleEvent(IHmvcEvent event) {
		
		if (event instanceof GetModelDataEvent) {
			
			getController().fireEventLocal(new SetModelDataEvent(getOrtDTO()));
			
		} else if (event instanceof AddTrainingResultEvent) {
			
			if (event.getPayload() instanceof List) {
				addTrainingResult((List) event.getPayload());
			}
			
		} else if (event instanceof GetTrainingLessonsEvent) {
			generateTrainingLessons();
		} else if (event instanceof GetExamenEvent) {
			generateExamen();
		} else if (event instanceof GetOrtStatusEvent) {
			getController().fireEventDown(new SetOrtStatusEvent(getOrtDTO().getOrtStatus()));
		}
	}
	
	private void generateExamen() {
		
		Examen examen = new Examen("Prüfung Ort-Basics", Examen.EXAMEN_TYP_BRONCE, BronceLessonGenerator.getListAdditionLessons(20, getOrtDTO()));
		
		getController().fireEvent(new SetExamenEvent(examen), false, false, true);
	}

	private void generateTrainingLessons() {
		
		List listTrainingLessons = BronceLessonGenerator.getListAdditionLessons(5, getOrtDTO());
		SetTrainingLessonsEvent event = new SetTrainingLessonsEvent(listTrainingLessons);
		
		getController().fireEvent(event, false, false, true);
		
	}

	private void addTrainingResult(List listLessons) {
		
		OrtStatusDTO ortStatusDTO = getOrtDTO().getOrtStatus();
		
		Iterator iterator = listLessons.iterator();
		while (iterator.hasNext()) {
			Lesson lesson = (Lesson) iterator.next();
			AufgabenStatusDTO aufgabenStatusDTO = lesson.getAufgabensStatusDTO();
			
			ortStatusDTO.addAufgabenStatusDTO(aufgabenStatusDTO);
		}
		
	}

	public void terminate() {
		// TODO Auto-generated method stub
		
	}

}
